<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<script>
    window.onload = function () {
        // 使用 继承 的思想
        // 把b、c 的原型指向a，a的原型指向 stooge 那么stooge、a就是他们共享的属性和方法 
        // 层层嵌套 层层递进 这样就形成了原型链
        let stooge = {
            ok: "AAAok",
            cancel: "AAAno",
            name: 'AAA',
        }
        let a = Object.create(stooge);
        a.sayName = function () {
            console.log(this.name)
        }
        //关键步骤 b、c的原型 prototype 指向a  类似于重写了b、c的原型对象 
        let b = Object.create(a);
        let c = Object.create(a);

        // 而b、c同样可以实现自己的私有的属性和方法
        b.name = "bbb"
        c.name = "ccc"

        console.log(stooge);
        // 给a的原型对象（stooge）添加属性 
        a.__proto__.getOK = "getOk";
        console.log(a);
        console.log(b);
        console.log(c);

        console.log(stooge.cancel)
        console.log(a.cancel)
        console.log(b.cancel)
        console.log(c.cancel)


        // this 谁调用this就指向谁的作用域 
        b.sayName(); //bbb
        c.sayName(); //ccc

        // 当用变量时  不能使用instanceof（只能判断 Array、String等） 判断其引用类型 
        // console.log(b instanceof a);

        // 同理 当使用变量访问prototype.isPrototypeOf()出错 只能用__proto_
        console.log(a.__proto__.isPrototypeOf(b)); //true
        console.log(stooge.__proto__.isPrototypeOf(b)); //true
        console.log(Object.prototype.isPrototypeOf(b)); //true

        // 原型共享问题   当子类都没有重写属性时 而是更改了父类的属性  那么同样会反映到其他的子类 造成不必要的损失
        // 不能向超类型传递参数 
        stooge.colors=['red','black'];
        b.colors.push('yellow');

        console.log(a.colors);
        console.log(b.colors);

    }
</script>

<body></body>

</html>